Глава III
3.2. Определение и свойства кривых B-сплайнов

Кривая B-сплайна `p`ой степени определяется как

`C(u)=sum_{i=0}^nN_{i,p}(u)P_i`   `a≤u≤b`(3.1)

где `{P_i}` это контрольные точки, и `{N_{i,p}(u)}` являются базисной функцией B-сплайна `p`-ой степени (уравнение [2.5]), определенная на непериодическом (и нео­днородной) узловом векторе

`U="{"ubrace(a,…,a)_(p+1),u_{p+1},…,u_{m-p-1},ubrace(b,…,b)_(p+1)"}"`

(`m+1` узлах). Если не указано иное, мы предполагаем, что `a=0` и `b=1`. Много­уголь­ник, образованный `{P_i}` называется контрольный многоугольник. Примеры B-сплайн кривых (в некоторых случаях вместе с соответствующими базисными функ­ци­ями), показаны на рис 3.1-3.14.

Рисунок 3.1. Кубическая кривая B-сплайна на `U={0,0,0,0,1,1,1,1}`, то есть кубическая кривая Безье.

Три шага необходимы для вычисления точки на кривой B-сплайна с фиксирован­ным значением u:

  1. найти промежуточный узел, в котором лежит `u` (Алгоритм A2.1);
  2. вычислить отличные от нуля базисные функции (Алгоритм A2.2);
  3. умножить значения ненулевых базисных функций с соответствующими контрольными точками.
Рассмотрим пример Пример2.3 раздела 2.5, с `U={0,0,0,1,2,3,4,4,5,5,5}`, `u=5⁄2` и `p=2`. Тогда `u∈[u_4,u_5)`, и

`N_{2,2}(5/2)=1/8`   `N_{3,2}(5/2)=6/8`   `N_{4,2}(5/2)=1/8`

Умножая на значения контрольных точек

`C(5/2)=1/8 P_2+6/8 P_3+1/8 P_4`

Соответствующий Алгоритм.

Алгоритм А3.1

CurvePoint(n,p,U,P,u,C)
{ /*  Вычисление  точек  кривой  */
  /* Вход: n,p,U,P,u  */
  /* Выход: C  */
span = FindSpan(n,p,u,U);
BasisFuns(span,u,p,U,N);
С = 0.0;
for (i=0; i<=p; i++)
   С = С + N[i]*P[span-p+i];
}
    

Теперь мы перечислим ряд свойств кривых B-сплайнов. Эти свойства следуют из при­веденных в главе 2 для функции `N_{i,p}(u)`. Пусть `C(u)` определяется по формуле (3.1).

Св.3.1 Если `n=p` и `U={0,…,0,1,…,1}`, тогда `C(u)` кривая Безье (рис 3.1);
Св.3.2 `C(u)` является кусочно-многочленной кривой (поскольку `N_{i,p}(u)` являются кусочными многочленами); Степень, `p`, количество контрольных точек, `n+1`, и число узлов, `m+1`, связаны

`m=n+p+1`(3.2)

(смотри раздел 2.4). Рисунки 3.2 и 3.3 показывают базисные функции и участки кривых B-сплайнов, соответствующих отдельным интервальным узлам; в обоих рисунках пе­ременные сплошные/пунктирные сегменты соответствуют различным многочленам (интервальным узлам) определённой кривой.

Рисунок 3.2. (а) кубические базисные функции `U={0,0,0,0,`1⁄4,1⁄2,3⁄4`,1,1,1,1}`; (б) кубическая кривая с использованием базисных функций на рисунке 3.2a.

Рисунок 3.3. (а) квадратичные базисные функции по `U={0,0,0,`1⁄5,2⁄5,3⁄5,4⁄5`,1,1,1}`; (б) квадратичная кривая с использованием базисных функций на рисунке 3.3a.

Св.3.3 Интерполяция конечной точки: `C(0)=P_0` и `C(1)=P_n`;
Св.3.4 Аффинная инвариантность: аффинное преобразование применяемое к кривой, приме­няется к её контрольным точкам. Пусть `r` точка в `E^3` (трехмерное евклидово про­стран­ство). Аффинное преобразование, обозначаемое `Φ`, проецирования `E^3` в `E^3` и имеет вид

`Φ(r)=Ar+v`

где `A` это `3×3` матрица и `v` является вектором. Аффинные преобразования включают перемещения, вращения, масштабирование и подрезка. Аффинное свойство инвариант­ности для кривых B-сплайнов следует из свойства разбиения единицы `N_{i,p}(u)`. Итак, пусть `r=∑a_ip_i`, где `p_i∈Ε^3` и `∑a_i=1`. Тогда

`Φ(r)=Φ(suma_ip_i)=A(∑a_ip_i)+v=` `∑a_iAp_i+∑a_iv=∑a_i(Ap_i+v)=∑a_iΦ(p_i)`

Св.3.5 Сильное свойство выпуклой оболочки: кривая содержится в выпуклой оболочке её управляющего многоугольника; в самом деле, если `u∈[u_i,u_{i+1})`, `p≤i≤m-p-1`, то `C(u)` в выпуклой оболочке опорных точек `P_{i-p},…,P_i` (рис 3.4, 3.5 и 3.6). Это следует из не отрицательности и свойства разбиения единицы `N_{i,p}(u)` (Свойств Св.2.3 и Св.2.4), и свойства, когда `N_{j,p}(u)=0` для `j<i-p` и `j>i`, тогда `u∈[u_i,u_{i+1})`, (Свойство Св.2.2). Рисунок 3.6 показывает, как построить квадратичную кривую, содержащий сегмент прямой линии. С `P_2`, `P_3` и `P_4` лежат на одной прямой, свойство сильной выпуклой оболочки заставляет кривую быть прямолинейной на отрезке от `C(2⁄5)` до `C(3⁄5)`.

Рисунок 3.4. Свойство сильной выпуклой оболочки для квадратичной кривой B-сплайна; для `u in [u_i,u_{i+1})`, `C(u)` находится в треугольнике `P_{i-2}P_{i-1}P_i`.

Рисунок 3.5. Свойство сильной выпуклой оболочки для кубической кривой B-сплайна; для `u in [u_i,u_{i+1})`,`C(u)` находится в четырехугольнике `P_{i-3}P_{i-2}P_{i-1}P_i`.

Рисунок 3.6. Квадратичная кривая B-сплайна для `U={0,0,0,`1⁄5,2⁄5,3⁄5,4⁄5,`1,1,1}`. Кривая представляет собой прямую линию между C(2⁄5) и C(3⁄5).

Св.3.6 Местная схема модификации: перемещение `P_i` меняет `C(u)` только в интервале `[u_i,u_{i+p+1})` ( рис 3.7). Это следует из того, что `N_{i,p}(u)=0` для `u∉[u_i,u_{i+p+1})` (Свойство Св.2.1).

Рисунок 3.7. Кубическая кривая по `U={0,0,0,0,`1⁄4,1⁄2,3⁄4,`1,1,1,1}`; перемещение `P_4` (к `P_4^'`) изменяет кривую в интервале [1⁄4,1).

Св.3.7 Контрольный многоугольник представляет собой кусочно-линейную аппроксимацию к кривой; это приближение улучшается путем введения узлов или степени высоты (см главу 5). Как правило, чем ниже степень, тем ближе кривая B-сплайна следует к её контрольному многоугольнику (рисунки 3.8 и 3.9). Кривые на рисунке 3.9 определены с использованием одних и тех же шести контрольных точек, и векторами узлов

Рисунок 3.8. Кривые B-сплайнов, (a) Кривая Безье девятой степени на векторе узлов `U={0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1}`; (б) квадратичная кривая, использующая тот же контрольный многоугольник, определенный на `U={0,0,0,`1⁄8,2⁄8,3⁄8,4⁄8,5⁄8,6⁄8,7⁄8`,1,1,1}`.

Рисунок 3.9. Кривые B-сплайнов разной степени с использованием одного и того же контрольного многоугольника.

`p=1∶U={0,0,`1⁄5,2⁄5,3⁄5,4⁄5`,1,1}`

`p=2∶U={0,0,0,`1⁄4,1⁄2,3⁄4`,1,1,1}`

`p=3∶U={0,0,0,0,`1⁄3,2⁄3`,1,1,1,1}`

`p=4∶U={0,0,0,0,0,`1⁄2`,1,1,1,1,1}`

`p=5∶U={0,0,0,0,0,0,1,1,1,1,1,1}`

Причина этого явления является интуитивно понятной: чем ниже степень, тем меньше контрольных точек, которые вносят вклад вычисления `C(u_0)` для любого заданного `u_0`. Крайний случай `p=1`, для которого каждая точка `C(u)` просто линейная интерполяция между двумя контрольными точками. В этом случае кривая является контрольным многоугольником;
Св.3.8 Двигаясь по кривой от `u=0` к `u=1`, функции `N_{i,p}(u)` действуют как переключатели; как `u` проходит узел, один `N_{i,p}(u)` (и, следовательно, соответствующие `P_i`) выклю­чает­ся, и следующий включается (рис 3.2 и 3.3).
Св.3.9 Свойство уменьшения измерения: нет плоскости имеющей больше пересечений с кри­вой, чем с контрольным многоугольником (замените слово “плоскость” на “линию”, для двумерных кривых) - см [ Lane83] для доказательства;
Св.3.10 Непрерывность и дифференцируемость `C(u)` следует из `N_{i,p}(u)` (просто `C(u)` является линейной комбинацией `N_{i,p}(u)`). Таким образом, `C(u)` бесконечно дифференцируема в границах узловых интервалов, и это, по крайней мере `p-k` раз непрерывно дифферен­цируема в узел кратности `k`. Рисунок 3.10 показывает квадратичную кривую (`p=2`). Кривая `C^1` непрерывна (первая производная непрерывна, но второй нет) во всех внут­ренних узлах кратности 1. На двойной узел, `u=4⁄5`, `C(u)` только `C^0` непрерывна, при этом она параболическая (визуальный разрыв). Рисунок 3.11 показывает квадра­тичную кривую, определенную на тех же векторах узлов. Таким образом, эти две кри­вые использовали одни и те же базисные функции, `N_{i,p}(u)`, для их определения. Но кривая на рис 3.11 `C^1` непрерывна в `u=4⁄5`; это не очевидно, но можно увидеть, используя производную выражения, заданного в разделе 3.3. Это просто следствие того факта, что разрывные функции иногда могут быть объединены таким образом, что результат является непрерывным. Обратите внимание, что `P_4`, `P_5` и `P_6` лежат на одной прямой, `length(P_4 P_5)=length(P_5 P_6)`. Рисунок 3.12 показывает кубическую кривую, `C^2` непрерывна в `u=`1⁄4, и `u=`1⁄2, но только `C^1` непрерывна в двойном узле `u=3⁄4`. Глаз обнаруживает разрывы во второй производной, но, вероятно, не в третьих и высших производных. Таким образом, кубики, как правило, достаточно для визуальных целей.

Рисунок 3.10. Квадратичная кривая для `U={0,0,0,`1⁄5,2⁄5,3⁄5,4⁄5`,1,1,1}` с острием при `u=4⁄5`.

Рисунок 3.11. Квадратичная кривая по `U={0,0,0,`1⁄5,2⁄5,3⁄5,4⁄5`,1,1,1}`; первая производная непрерывна при `u=4⁄5`.

Рисунок 3.12. Кубическая кривая на `U={0,0,0,0,`1⁄4,1⁄2,3⁄4`,1,1,1,1}`, `C^2` непрерывный при `u=1⁄4` и `u=1⁄2`, и `C^1` непрерывный при `u=3⁄4`.

Св.3.11 Возможно (и иногда полезно) использовать несколько (совпадающих) контрольных то­чек. Рисунок 3.13 показывает квадратичную кривую с двойной точкой управления, `P_2``=P_3`. Интересная часть этой кривой лежит между C(1⁄2) и C(3⁄4). Действи­тельно, C(1⁄2)`=P_2=P_3`, и сегменты кривой между C(1⁄4) и C(1⁄2), и C(1⁄2) и C(3⁄4), представляют со­бой прямые линии. Это следует из свойства Св.3.5, например, `C(u)` в выпуклой обо­лочке `P_1P_2P_3` (линии), если `u∈`[1⁄4,1⁄2). Кроме того, поскольку узел `u=`1⁄2 имеет крат­ность `=1`, кривая должна быть `C^1` непрерывной там, даже если он имеет точку воз­врата (визуальный разрыв). Это результат от величины первой производной вектора стремится к нулю (непрерывно) на `u=`1⁄2. В следующем разделе мы увидим, что произ­вод­ная в `u=`1⁄2 пропорциональна разнице, `P_3-P_2`. Рисунки 3.14а и 3.14б де­монстрируют кубические примеры, используя тот же контрольный многоугольник, в том числе точки двойного управления, `P_2=P_3`, но с различными векторами узлов.

Рисунок 3.13. Квадратичная кривая на `U={0,0,0,0,`1⁄4,1⁄2,3⁄4,`1,1,1,1}`; `P_2=P_3` двойная контрольная точка.

Рисунок 3.14. Кубические кривые с двойной контрольной точкой `P_2=P_3` (a) `U={0,0,0,0,`1⁄4,3⁄4,`1,1,1,1}` (b) `U={0,0,0,0,`1⁄2,1⁄2,`1,1,1,1}`.